package demo.StringBuffer;

/**
 * String 、 StringBuffer StringBuilder 使用策略【优化方案】
 */
public class StringBuffers {

    public static void main(String[] args)
    {

        /*（1）基本原则：
        如果要操作少量的数据，用String ；
        单线程操作大量数据，用StringBuilder ；
        多线程操作大量数据，用StringBuffer。
        （2）不要使用String类的"+"来进行频繁的拼接，因为那样的性能极差的，应该使用StringBuffer或StringBuilder类，这在Java的优化上是一条比较重要的原则。例如：*/

        String[] hugeArray = {"111","222"};
        String result1 = "";
        for (String s : hugeArray) {
            result1 = result1 + s;
        }

        StringBuilder sb = new StringBuilder();
        for (String s : hugeArray){
            sb.append(s+"-");
        }
        String result = sb.append('\n').toString();
        System.out.print(result);

        StringBuffer string = new StringBuffer();
        for (String s : hugeArray){
            string.append(s+"+");
        }
        String result2 = string.append('\n').toString();
        System.out.print(result2);
        //当出现上面的情况时，显然我们要采用第二种方法，因为第一种方法，每次循环都会创建一个String result用于保存结果，除此之外二者基本相同（对于jdk1.5及之后版本）。
        /*（3）为了获得更好的性能，在构造 StringBuffer 或 StringBuilder 时应尽可能指定它们的容量。当然，如果你操作的字符串长度（length）不超过 16 个字符就不用了，
        当不指定容量（capacity）时默认构造一个容量为16的对象。不指定容量会显著降低性能。

        （4）StringBuilder 一般使用在方法内部来完成类似 + 功能，因为是线程不安全的，所以用完以后可以丢弃。StringBuffer 主要用在全局变量中。
        ringBuilder 一般使用在方法内部来完成类似 + 功能，因为是线程不安全的，所以用完以后可以丢弃。StringBuffer 主要用在全局变量中。

        （5）相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升，但却要冒多线程不安全的风险。而在现实的模块化编程中，
        负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行，因此：除非确定系统的瓶颈是在 StringBuffer 上，并且确定你的模块不会运行在多线程模式下，
        才可以采用 StringBuilder；否则还是用 StringBuffer。
         */

    }
}
